package es.wtestgen.util;

import java.awt.Color;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.lowagie.text.Cell;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.HeaderFooter;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.Table;
import com.lowagie.text.pdf.PdfFormField;
import com.lowagie.text.pdf.PdfWriter;

import es.wtestgen.domain.Alumno;
import es.wtestgen.domain.Examen;
import es.wtestgen.domain.Pregunta;
import es.wtestgen.domain.Profesor;
import es.wtestgen.domain.Respuesta;

public class GeneradorPdf {
	
	private static final Log log = LogFactory.getLog(GeneradorPdf.class);
	
	public static void generarExamenPdf(HttpServletRequest request, HttpServletResponse response, Examen examen,
											Document document, ByteArrayOutputStream baos
											){
		
		Set<Pregunta> preguntas = (Set<Pregunta>)examen.getPreguntas();
		Set<Respuesta> respuestas = (Set<Respuesta>)examen.getRespuestas();
		boolean esAlumno = (Boolean)request.getSession().getAttribute("esAlumno");
		Paragraph nombre, fecha, asignatura = null;
		
		if(!esAlumno){
			Profesor profesor = (Profesor)request.getSession().getAttribute("usuario");			
			nombre = new Paragraph(profesor.getNombre().toUpperCase() + " " + profesor.getApellidos().toUpperCase());
		}else{
			Alumno alumno = (Alumno)request.getSession().getAttribute("usuario");			
			nombre = new Paragraph(alumno.getNombre().toUpperCase() + " " + alumno.getApellidos().toUpperCase());
		}
		
		
		try{
			PdfWriter writer = PdfWriter.getInstance(document, baos);
			
			Table tabla = new Table(2);
			
			//tabla.setBackgroundColor(Color.lightGray);
			tabla.setBorder(0);
			float [] t = {7f,93f};
			tabla.setWidths(t);
			
			
			tabla.setCellpadding(2f);
			tabla.setCellspacing(2f);
			
			int i=1;
			for (Iterator iterator = preguntas.iterator(); iterator.hasNext();) {
				Pregunta pregunta = (Pregunta) iterator.next();
				
				Cell celda = new Cell();
				Cell celdaNumero = new Cell();
				celda.setBorder(0);
				celdaNumero.setBorder(0);
				celdaNumero.setHorizontalAlignment("Center");
				String p = pregunta.getEnunciadoPreg();
				
				celda.add(new Paragraph(Utiles.quitarHTMLPdf(p)));	
				celdaNumero.add(new Paragraph(i+"."));				
				celda.setBackgroundColor(Color.LIGHT_GRAY);
				celdaNumero.setBackgroundColor(Color.LIGHT_GRAY);
				tabla.addCell(celdaNumero);				
				tabla.addCell(celda);				
				
				int j=1;
				for (Iterator iterator2 = respuestas.iterator(); iterator2
						.hasNext();) {
					Respuesta respuesta = (Respuesta) iterator2.next();
					if(respuesta.getPregunta().getCodPreg() == pregunta.getCodPreg()){
						Cell celdaR = new Cell();
						Cell celdaLetra = new Cell();
						Paragraph parrafo = null;
						celdaR.setBorder(0);
						celdaLetra.setBorder(0);
						String r = respuesta.getRespuestaResp();
						celdaR.add(new Paragraph(Utiles.quitarHTMLPdf(r)));
						if(j==1){
							parrafo = new Paragraph("a.");													
						}else if(j==2){
							parrafo = new Paragraph("b.");												
						}else if(j==3){
							parrafo = new Paragraph("c.");
						}else if(j==4){
							parrafo = new Paragraph("d.");							
						}else if(j==5){
							parrafo = new Paragraph("e.");							
						}else if(j==6){
							parrafo = new Paragraph("f.");							
						}else if(j==7){
							parrafo = new Paragraph("g.");							
						}else if(j==8){
							parrafo = new Paragraph("h.");							
						}else if(j==9){
							parrafo = new Paragraph("i.");							
						}else if(j==10){
							parrafo = new Paragraph("j.");							
						}else if(j==11){
							parrafo = new Paragraph("k.");							
						}else if(j==12){
							parrafo = new Paragraph("l.");							
						}else if(j==13){
							parrafo = new Paragraph("m.");							
						}else if(j==14){
							parrafo = new Paragraph("n.");							
						}else if(j==15){
							parrafo = new Paragraph("ñ.");							
						}else if(j==16){
							parrafo = new Paragraph("o.");							
						}else if(j==17){
							parrafo = new Paragraph("p.");							
						}else if(j==18){
							parrafo = new Paragraph("q.");							
						}else if(j==19){
							parrafo = new Paragraph("r.");							
						}else if(j==20){
							parrafo = new Paragraph("s.");							
						}else if(j==21){
							parrafo = new Paragraph("t.");							
						}else if(j==22){
							parrafo = new Paragraph("u.");							
						}else if(j==23){
							parrafo = new Paragraph("v.");							
						}else if(j==24){
							parrafo = new Paragraph("w.");							
						}else if(j==25){
							parrafo = new Paragraph("x.");							
						}else if(j==26){
							parrafo = new Paragraph("y.");							
						}else if(j==27){
							parrafo = new Paragraph("z.");							
						}
						
						parrafo.setAlignment("Center");							
						celdaLetra.add(parrafo);		
						
						celdaLetra.setHorizontalAlignment("Center");
						
						tabla.addCell(celdaLetra);
						tabla.addCell(celdaR);
						j++;
					}
					
				}
				i++;
			}
			
			document.addAuthor("Generador de Exámenes de Tipo Test Automático - WTestGen");
			document.addCreationDate();
			document.addCreator("Generador de Exámenes de Tipo Test Automático - WTestGen");
			document.addSubject("Examen");
			document.addTitle("Generador de Exámenes de Tipo Test Automático - WTestGen");			
			
			document.open();
			
			//document.add(new Paragraph("Prueba para el examen: " + examen.getCodExam()));
			
			
			/**
			 * Añadimos la cabecera del examen
			 */
			
			Table tablaCabecera = new Table(2);
			float [] tam = {20f,80f};
			tablaCabecera.setWidths(tam);
			tablaCabecera.setCellpadding(2f);
			tablaCabecera.setCellspacing(2f);
			
			
			Cell celdaTituloNombre = new Cell();
			Cell celdaTituloAsignatura = new Cell();
			Cell celdaTituloFecha = new Cell();
			Cell celdaDatoNombre = new Cell();
			Cell celdaDatoAsignatura = new Cell();
			Cell celdaDatoFecha = new Cell();
			
			celdaTituloNombre.add(new Paragraph("Nombre"));
			celdaTituloAsignatura.add(new Paragraph("Asignatura"));
			celdaTituloFecha.add(new Paragraph("Fecha"));
			
			celdaTituloNombre.setBackgroundColor(Color.LIGHT_GRAY);
			celdaTituloAsignatura.setBackgroundColor(Color.LIGHT_GRAY);
			celdaTituloFecha.setBackgroundColor(Color.LIGHT_GRAY);
			
			asignatura = new Paragraph(examen.getAsignatura().getNombreAsig());
			fecha = new Paragraph(examen.getFechaExam());
			
			if(esAlumno){
				celdaDatoNombre.add(nombre);				
			}else{
				celdaDatoNombre.add(new Paragraph());			
			}
			celdaDatoAsignatura.add(asignatura);
			celdaDatoFecha.add(fecha);
			
			celdaTituloAsignatura.setVerticalAlignment("Middle");
			celdaTituloAsignatura.setHorizontalAlignment("Right");
			
			celdaTituloNombre.setVerticalAlignment("Middle");
			celdaTituloNombre.setHorizontalAlignment("Right");
			celdaTituloFecha.setVerticalAlignment("Middle");
			celdaTituloFecha.setHorizontalAlignment("Right");
			
			celdaDatoAsignatura.setVerticalAlignment("Middle");
			celdaDatoNombre.setVerticalAlignment("Middle");
			celdaDatoFecha.setVerticalAlignment("Middle");
			
			tablaCabecera.addCell(celdaTituloNombre);
			tablaCabecera.addCell(celdaDatoNombre);
			tablaCabecera.addCell(celdaTituloAsignatura);
			tablaCabecera.addCell(celdaDatoAsignatura);
			tablaCabecera.addCell(celdaTituloFecha);
			tablaCabecera.addCell(celdaDatoFecha);		
			
			
			/**
			 * Añadimos el nombre del alumno
			 */
			//document.add(nombre);
			//document.add(new Paragraph("Asignatura: " + examen.getAsignatura().getNombreAsig()));
			//document.add(new Paragraph("Fecha: " + examen.getFechaExam()));
			
			Paragraph espacio = new Paragraph();
			
			espacio.setSpacingBefore(2f);
			espacio.setSpacingAfter(10f);
			
			
			document.add(tablaCabecera);
			document.add(espacio);
			document.add(tabla);
			document.close();

			response.setContentType("application/pdf");
			response.setContentLength(baos.size());
			
		}catch (DocumentException e) {
			log.info("_____Error: no se ha podido abrir o crear el documento",e);
		}/*catch (IOException e) {
			log.info("_____Error: no se ha podido generar el documento en Pdf");
		}	*/	
	}
	public static void generarExamenResueltoPdf(HttpServletRequest request, HttpServletResponse response, Examen examen,
			Document document, ByteArrayOutputStream baos
	){
		
		Set<Pregunta> preguntas = (Set<Pregunta>)examen.getPreguntas();
		Set<Respuesta> respuestas = (Set<Respuesta>)examen.getRespuestas();
		boolean esAlumno = (Boolean)request.getSession().getAttribute("esAlumno");
		Paragraph nombre, fecha, asignatura = null;
		
		if(!esAlumno){
			Profesor profesor = (Profesor)request.getSession().getAttribute("usuario");			
			nombre = new Paragraph(profesor.getNombre().toUpperCase() + " " + profesor.getApellidos().toUpperCase());
		}else{
			Alumno alumno = (Alumno)request.getSession().getAttribute("usuario");			
			nombre = new Paragraph(alumno.getNombre().toUpperCase() + " " + alumno.getApellidos().toUpperCase());
		}
		
		
		try{
			PdfWriter writer = PdfWriter.getInstance(document, baos);
			
			Table tabla = new Table(2);
			
			//tabla.setBackgroundColor(Color.lightGray);
			tabla.setBorder(0);
			float [] t = {7f,93f};
			tabla.setWidths(t);
			
			
			tabla.setCellpadding(2f);
			tabla.setCellspacing(2f);
			
			int i=1;
			for (Iterator iterator = preguntas.iterator(); iterator.hasNext();) {
				Pregunta pregunta = (Pregunta) iterator.next();
				
				Cell celda = new Cell();
				Cell celdaNumero = new Cell();
				celda.setBorder(0);
				celdaNumero.setBorder(0);
				celdaNumero.setHorizontalAlignment("Center");
				String p = pregunta.getEnunciadoPreg();
				
				celda.add(new Paragraph(Utiles.quitarHTML(p)));	
				celdaNumero.add(new Paragraph(i+"."));				
				celda.setBackgroundColor(Color.LIGHT_GRAY);
				celdaNumero.setBackgroundColor(Color.LIGHT_GRAY);
				tabla.addCell(celdaNumero);				
				tabla.addCell(celda);				
				
				int j=1;
				for (Iterator iterator2 = respuestas.iterator(); iterator2
				.hasNext();) {
					Respuesta respuesta = (Respuesta) iterator2.next();
					if(respuesta.getPregunta().getCodPreg() == pregunta.getCodPreg()){
						Cell celdaR = new Cell();
						Cell celdaLetra = new Cell();
						Paragraph parrafo = null;
						celdaR.setBorder(0);
						celdaLetra.setBorder(0);
						String r = respuesta.getRespuestaResp();
						if (respuesta.isEsCorrecta()){
							celdaR.add(new Paragraph(Utiles.quitarHTML(r),new Font(Font.TIMES_ROMAN, 14, Font.BOLD)));							
						}else{
							celdaR.add(new Paragraph(Utiles.quitarHTML(r)));
						}
						
						
						if(j==1){
							parrafo = new Paragraph("a.");													
						}else if(j==2){
							parrafo = new Paragraph("b.");												
						}else if(j==3){
							parrafo = new Paragraph("c.");
						}else if(j==4){
							parrafo = new Paragraph("d.");							
						}else if(j==5){
							parrafo = new Paragraph("e.");							
						}else if(j==6){
							parrafo = new Paragraph("f.");							
						}else if(j==7){
							parrafo = new Paragraph("g.");							
						}else if(j==8){
							parrafo = new Paragraph("h.");							
						}else if(j==9){
							parrafo = new Paragraph("i.");							
						}else if(j==10){
							parrafo = new Paragraph("j.");							
						}else if(j==11){
							parrafo = new Paragraph("k.");							
						}else if(j==12){
							parrafo = new Paragraph("l.");							
						}else if(j==13){
							parrafo = new Paragraph("m.");							
						}else if(j==14){
							parrafo = new Paragraph("n.");							
						}else if(j==15){
							parrafo = new Paragraph("ñ.");							
						}else if(j==16){
							parrafo = new Paragraph("o.");							
						}else if(j==17){
							parrafo = new Paragraph("p.");							
						}else if(j==18){
							parrafo = new Paragraph("q.");							
						}else if(j==19){
							parrafo = new Paragraph("r.");							
						}else if(j==20){
							parrafo = new Paragraph("s.");							
						}else if(j==21){
							parrafo = new Paragraph("t.");							
						}else if(j==22){
							parrafo = new Paragraph("u.");							
						}else if(j==23){
							parrafo = new Paragraph("v.");							
						}else if(j==24){
							parrafo = new Paragraph("w.");							
						}else if(j==25){
							parrafo = new Paragraph("x.");							
						}else if(j==26){
							parrafo = new Paragraph("y.");							
						}else if(j==27){
							parrafo = new Paragraph("z.");							
						}
						
						parrafo.setAlignment("Center");							
						celdaLetra.add(parrafo);		
						
						celdaLetra.setHorizontalAlignment("Center");
						
						tabla.addCell(celdaLetra);
						tabla.addCell(celdaR);
						j++;
					}
					
				}
				i++;
			}
			
			document.addAuthor("Generador de Exámenes de Tipo Test Automático - WTestGen");
			document.addCreationDate();
			document.addCreator("Generador de Exámenes de Tipo Test Automático - WTestGen");
			document.addSubject("Examen");
			document.addTitle("Generador de Exámenes de Tipo Test Automático - WTestGen");			
			
			document.open();
			
			//document.add(new Paragraph("Prueba para el examen: " + examen.getCodExam()));
			
			
			/**
			 * Añadimos la cabecera del examen
			 */
			
			Table tablaCabecera = new Table(2);
			float [] tam = {20f,80f};
			tablaCabecera.setWidths(tam);
			tablaCabecera.setCellpadding(2f);
			tablaCabecera.setCellspacing(2f);
			
			
			Cell celdaTituloNombre = new Cell();
			Cell celdaTituloAsignatura = new Cell();
			Cell celdaTituloFecha = new Cell();
			Cell celdaDatoNombre = new Cell();
			Cell celdaDatoAsignatura = new Cell();
			Cell celdaDatoFecha = new Cell();
			
			celdaTituloNombre.add(new Paragraph("Nombre"));
			celdaTituloAsignatura.add(new Paragraph("Asignatura"));
			celdaTituloFecha.add(new Paragraph("Fecha"));
			
			celdaTituloNombre.setBackgroundColor(Color.LIGHT_GRAY);
			celdaTituloAsignatura.setBackgroundColor(Color.LIGHT_GRAY);
			celdaTituloFecha.setBackgroundColor(Color.LIGHT_GRAY);
			
			asignatura = new Paragraph(examen.getAsignatura().getNombreAsig());
			fecha = new Paragraph(examen.getFechaExam());
			
			if(esAlumno){
				celdaDatoNombre.add(nombre);				
			}else{
				celdaDatoNombre.add(new Paragraph());			
			}
			celdaDatoAsignatura.add(asignatura);
			celdaDatoFecha.add(fecha);
			
			celdaTituloAsignatura.setVerticalAlignment("Middle");
			celdaTituloAsignatura.setHorizontalAlignment("Right");
			
			celdaTituloNombre.setVerticalAlignment("Middle");
			celdaTituloNombre.setHorizontalAlignment("Right");
			celdaTituloFecha.setVerticalAlignment("Middle");
			celdaTituloFecha.setHorizontalAlignment("Right");
			
			celdaDatoAsignatura.setVerticalAlignment("Middle");
			celdaDatoNombre.setVerticalAlignment("Middle");
			celdaDatoFecha.setVerticalAlignment("Middle");
			
			tablaCabecera.addCell(celdaTituloNombre);
			tablaCabecera.addCell(celdaDatoNombre);
			tablaCabecera.addCell(celdaTituloAsignatura);
			tablaCabecera.addCell(celdaDatoAsignatura);
			tablaCabecera.addCell(celdaTituloFecha);
			tablaCabecera.addCell(celdaDatoFecha);		
			
			
			/**
			 * Añadimos el nombre del alumno
			 */
			//document.add(nombre);
			//document.add(new Paragraph("Asignatura: " + examen.getAsignatura().getNombreAsig()));
			//document.add(new Paragraph("Fecha: " + examen.getFechaExam()));
			
			Paragraph espacio = new Paragraph();
			
			espacio.setSpacingBefore(2f);
			espacio.setSpacingAfter(10f);
			
			
			document.add(tablaCabecera);
			document.add(espacio);
			document.add(tabla);
			document.close();
			
			response.setContentType("application/pdf");
			response.setContentLength(baos.size());
			
		}catch (DocumentException e) {
			log.info("_____Error: no se ha podido abrir o crear el documento",e);
		}/*catch (IOException e) {
			log.info("_____Error: no se ha podido generar el documento en Pdf");
		}	*/	
	}

}
